using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;


using DataTransferObject;
using Business;

namespace Presentation
{
    public partial class FrmNhanVien : Form
    {
        BindingSource bs = new BindingSource();
        clsNhanVienDTO nhanvienDTO = new clsNhanVienDTO();
        clsQuanTriBUS  quantriBUS = new clsQuanTriBUS();
       
        DataTable tbl = new DataTable();
        string duongdanhinh = "";

        public FrmNhanVien()
        {
            InitializeComponent();
        }

        #region Phương thức đưa dữ liệu lên form.

        //Phương thức đưa dữ liệu lên form.
        private void LoadForm()
        {
            HienThiTextBox(false);
            btnluu.Enabled = false;


            cbobangcap.DisplayMember = "TenBC";
            cbobangcap.ValueMember = "MaBC";
            cbobangcap.DataSource = quantriBUS.LayThongTinBangCap();

            cbobophan.DisplayMember = "TenBP";
            cbobophan.ValueMember = "MaBP";
            cbobophan.DataSource = quantriBUS.LayThongTinBoPhan();

            cbochucvu.DisplayMember = "TenCV";
            cbochucvu.ValueMember = "MaCV";
            cbochucvu.DataSource = quantriBUS.LayThongTinChucVu();

         

            bs.DataSource = quantriBUS.LayChiTietThongTinNhanVien();
            bngnhanvien.BindingSource = bs;
            dgvnhanvien.DataSource = bs;
            TaoCotGridView();

            
        }
        #endregion

        #region Các phương thức ẩn-hiện Button, Textbox, Tạo cột cho DataGrid.

        //(Ẩn/hiện) Button.
        private void HienThiButton(bool dieukien)
        {
            btnthem.Enabled = dieukien;
            btnsua.Enabled = dieukien;
            btnxoa.Enabled = dieukien;
            btnluu.Enabled = dieukien;
        }

        //(Ẩn/hiện) TextBox.
        private void HienThiTextBox(bool a)
        {
            txthoten.Enabled = a;
            txtdiachi.Enabled = a;
            txttendangnhap.Enabled = a;
            txtmatkhau.Enabled = a;
            dtngaysinh.Enabled = a;
            txtdienthoai.Enabled = a;
            cbochucvu.Enabled = a;
            cbogioitinh.Enabled = a;
            cbobangcap.Enabled = a;
            cbobophan.Enabled = a;
            btnchonhinh.Enabled = a;
            
            
        }

        //Xóa TextBox.
        private void XoaTextBox()
        {
            txtmanv.Text = "";
            txthoten.Text = "";
            txtdiachi.Text = "";
            txttendangnhap.Text = "";
            txtmatkhau.Text = "";
            dtngaysinh.Text = "";
            txtdienthoai.Text = "";
            cbochucvu.Text = "";
            cbogioitinh.Text = "";
            cbobophan.Text = "";
            cbobangcap.Text = "";
            pchinh.Image =null ;
        }

        //Tạo cột cho GridView
        private void TaoCotGridView()
        {
            dgvnhanvien.Columns["Manv"].HeaderCell.Value = "Mã Nhân Viên";
            dgvnhanvien.Columns["HoTen"].HeaderCell.Value = "Họ Tên";
            dgvnhanvien.Columns["TendangNhap"].HeaderCell.Value = "Đăng Nhập";
            dgvnhanvien.Columns["MatKhau"].HeaderCell.Value = "Mật Khẩu";
            dgvnhanvien.Columns["NgaySinh"].HeaderCell.Value = "Ngày Sinh";
            dgvnhanvien.Columns["TenCV"].HeaderCell.Value = "Tên Chức Vụ";
            dgvnhanvien.Columns["TenBP"].HeaderCell.Value = "Tên Bộ Phận";
            dgvnhanvien.Columns["TenBC"].HeaderCell.Value = "Tên Bằng Cấp";
           
        }
        #endregion

        #region Các phương thức tạo mã tự động

        public String DinhdangMACH(String MACH)
        {
            if (MACH.Length == 1)
                MACH = "NV00" + MACH;
            else if (MACH.Length == 2)
                MACH = "NV0" + MACH;
            else if (MACH.Length == 3)
                MACH = "NV" + MACH;
            return MACH;
        }

        private int TimMaCauHoi()
        {
            int sl = 1;
            int dem = 0;
            tbl = quantriBUS.LayDanhSachNhanVien();
            foreach (DataRow dr in tbl.Rows)
            {
                int ma1 = Convert.ToInt16(Tim_CatChuoi(dr["MANV"].ToString()));
                dem++;
                int ma2 = Convert.ToInt16(Tim_CatChuoi(dr["MANV"].ToString()));

                if (dem != ma2)
                {
                    return dem;
                }
                else
                {
                    sl++;
                }

            }
            return sl;
        }


        public String Tim_CatChuoi(String Chuoicantim)
        {
            int vitri = 0;
            vitri = Chuoicantim.IndexOf(Chuoicantim, 0);
            if (vitri != -1)
                Chuoicantim = Chuoicantim.Remove(0, 2);
            return Chuoicantim;
        }

        #endregion

        #region Các phương thức thay đổi nút, chữ trên nút.

        //Khi nhấn nút thêm.
        private void NutThem()
        {
            btnthem.Text = "Hủy Bỏ";
            HienThiButton(false); //Ẩn tất cả các button.
            btnthem.Enabled = true;
            btnluu.Enabled = true;

            HienThiTextBox(true); //Hiển thị các textbox.
            XoaTextBox();
            txtmanv.Text = DinhdangMACH(TimMaCauHoi().ToString()); //Tạo mã tự động.
           // txtmachucvu.Focus();
        }

        //Khi nhấn nút hủy bỏ thêm.
        private void NutHuyBoThem()
        {
            btnthem.Text = "Thêm";
            HienThiButton(false); //Ẩn tất cả các button.
            btnthem.Enabled = true;
            btnsua.Enabled = true;
            btnxoa.Enabled = true;

            HienThiTextBox(false); //Hiển thị các textbox.
            XoaTextBox();
            RefreshForm();
            
        }

        //Khi nhấn nút sửa.
        private void NutSua()
        {
            btnsua.Text = "Hủy Bỏ";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;
            btnluu.Enabled = true;

            HienThiTextBox(true); //Hiển thị các textbox.
           
           // txtmachucvu.Enabled = false;
        }

        //Khi nhấn nút hủy bỏ sửa.
        private void NutHuyBoSua()
        {
            btnsua.Text = "Sửa";
            HienThiButton(false); //Ẩn tất cả các button.
            btnsua.Enabled = true;
            btnthem.Enabled = true;
            btnxoa.Enabled = true;

            HienThiTextBox(false);
            RefreshForm();
        }
        #endregion

        #region Các Button liên kết Form


        private void btnbophan_Click(object sender, EventArgs e)
        {
            FrmBoPhan frmbophan = new FrmBoPhan();
            frmbophan.Show();
        }

        private void btnchucvu_Click(object sender, EventArgs e)
        {
            FrmChucVu frmchucvu = new FrmChucVu();
            frmchucvu.Show();
        }

        private void btnbangcap_Click(object sender, EventArgs e)
        {
            FrmBangCap frmbangcap = new FrmBangCap();
            frmbangcap.Show();
        }

        #endregion

        private void dgvnhanvien_SelectionChanged(object sender, EventArgs e)
        {
            if (dgvnhanvien.SelectedRows.Count > 0) //Nếu trong DataGrid có từ 1 dòng trở lên.
            {
                txtmanv.Text = dgvnhanvien.SelectedRows[0].Cells["MaNV"].Value.ToString();
                nhanvienDTO.MaNV = txtmanv.Text.Trim();
                tbl = quantriBUS.TimThongTinNhanVien(nhanvienDTO);
                LoadLenTextBox(tbl);

            }

        }

        #region Load dữ liệu lên textbox

        private void FrmNhanVien_Load(object sender, EventArgs e)
        {
            LoadForm();
        }

       
        private void LoadLenTextBox(DataTable tbl)
        {
            foreach (DataRow dr in tbl.Rows)
            {
                txtmanv.Text = dr["MaNV"].ToString();
                txthoten.Text = dr["HoTen"].ToString();
                txttendangnhap.Text = dr["TenDangNhap"].ToString();
                txtmatkhau.Text = dr["MatKhau"].ToString();
                cbogioitinh.Text = dr["GioiTinh"].ToString();
                dtngaysinh.Text = dr["NgaySinh"].ToString();
                cbobangcap.Text = dr["TenBC"].ToString();
                cbobophan.Text = dr["TenBP"].ToString();
                cbochucvu.Text = dr["TenCV"].ToString();
                txtdiachi.Text = dr["DiaChi"].ToString();
                txtdienthoai.Text = dr["DienThoai"].ToString();
               
                

                duongdanhinh = dr["HinhAnh"].ToString();
                if (duongdanhinh != "")
                {
                    // pchinh.Show();
                    String url = Application.StartupPath + @"\" + duongdanhinh;
                    if (System.IO.File.Exists(url))
                        pchinh.Image = System.Drawing.Image.FromFile(url);
                    else
                        pchinh.Image = null;
                }
                else
                {
                    pchinh.Image = null;
                }

            }

        }
        #endregion

        #region Các sự kiện trên Form

        private void btnthem_Click(object sender, EventArgs e)
        {
            if (btnthem.Text == "Thêm")
            {
                NutThem(); //Khi nhấn nút thêm.
            }
            else
            {
                NutHuyBoThem(); //Khi nhấn nút hủy bỏ thêm.
            }
        }

        private void btnsua_Click(object sender, EventArgs e)
        {

            if (btnsua.Text == "Sửa")
            {
                NutSua(); //Khi nhấn nút sửa.
            }
            else
            {
                NutHuyBoSua(); //Khi nhấn nút hủy bỏ sửa.
            }
        }

        private void btnthoat_Click(object sender, EventArgs e)
        {
            DialogResult dlg = new DialogResult();
            dlg = DevComponents.DotNetBar.MessageBoxEx.Show("Có muốn thoát không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dlg == DialogResult.Yes)
            {
                this.Close();
            }
        }

        #endregion

        #region Kiểm Tra Điện Thoại Nhập Bằng Số
        private void txtdienthoai_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsLetter(e.KeyChar) == true && char.IsControl(e.KeyChar) == false)
                e.Handled = true;
            if (txtdienthoai.Text.Length > 10)
                e.Handled = true;
        }

        #endregion

        #region Kiểm Tra Ngày Sinh

        private bool KiemTraNgaySinh()
        {
            bool ketqua = true;
            try
            {
                DateTime ngaysinh = DateTime.Parse(this.dtngaysinh.Text);

            }
            catch (SystemException)
            {
                ketqua = false;
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Nhập đúng dạng ngày sinh(DD/MM/YYYY) ", "Thông Báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                this.dtngaysinh.Focus();



            }
            return ketqua;

        }

        #endregion

        #region Các phương thức kiểm tra rỗng, refresh data

        //Phương thức kiểm tra dữ liệu rỗng.
        private bool CheckEmpty(clsNhanVienDTO  obj)
        {
           NhanVienBusResult  rs;

            rs = quantriBUS.KiemTraRong(obj); //Gọi hàm kiểm tra rỗng.
            if (rs == NhanVienBusResult.HOTENERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Họ Tên không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txthoten.Focus();
                return false;
            }

            if (rs == NhanVienBusResult.GIOITINHERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Giới Tính không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
               cbogioitinh.Focus();
                return false;
            }

            if (rs == NhanVienBusResult.TENDANGNHAPERROR) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Tên Đăng Nhập không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txttendangnhap.Focus();
                return false;
            }

            if (rs == NhanVienBusResult.MATKHAUERROR ) 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Mật Khẩu không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
               txtmatkhau .Focus();
                return false;
            }

            if (rs == NhanVienBusResult.BOPHANERROR ||cbobophan .Text =="") 
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Bộ Phận không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
               cbobophan.Focus();
                return false;
            }

            if (rs == NhanVienBusResult.CHUCVUERROR ||cbochucvu .Text =="")
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Chức Vụ không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cbochucvu.Focus();
                return false;
            }

            if (rs == NhanVienBusResult.BANGCAPERROR ||cbobangcap .Text =="")
            {
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Bằng Cấp không được rỗng!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                cbobangcap.Focus();
                return false;
            }
            
            return true;
        }

        //Phương thức Refresh lại form.
        private void RefreshForm()
        {
            bs.DataSource = quantriBUS.LayChiTietThongTinNhanVien ();
            bngnhanvien.BindingSource = bs;

            HienThiTextBox(false);
            HienThiButton(true);
            btnluu.Enabled = false;
        }
        #endregion

        #region Kiểm Tra Tuổi

        private bool KiemTraTuoi()
        {
            bool flag = true;

            clsThayDoiQuyDinhBUS quydinhBus = new clsThayDoiQuyDinhBUS();
           
            tbl = quydinhBus .DanhSachThayDoiQuyDinh ();
            int tuoi;
            tuoi = (DateTime.Now.Year) - (Convert.ToDateTime(dtngaysinh.Text).Year);

            foreach (DataRow dr in tbl.Rows)
            {
                int tuoimin = Convert.ToInt32(dr["TuoiToiThieu"]);
               
                if ((tuoi < tuoimin))
                {
                    DevComponents.DotNetBar.MessageBoxEx.Show(this, "Số Tuổi Không Phù Hợp", "Thông Báo", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    dtngaysinh.Focus();
                    flag = false;
                }
            }
            return flag;
        }

        #endregion


        #region Các phương thức thêm, sửa, xóa



        //Phương thức thêm nhân viên.
        private void ThemNhanVien()
        {
            NhanVienBusResult rs;
            bool check;

            //Kiểm tra xem có thuộc tính nào bị rỗng ko.
            check = false;
            check = CheckEmpty(nhanvienDTO);

            //Nếu có thuộc tính rỗng.
            if (check == false) 
                return;

            // Kiểm tra tuổi
            
            check = KiemTraTuoi();
            if (check == false)
                return;

            //Thêm dữ liệu vào.
            rs = quantriBUS.ThemMotNhanVien(nhanvienDTO);
            //Nếu thêm thành công.
            if (rs == NhanVienBusResult.OK) 
                DevComponents.DotNetBar.MessageBoxEx.Show(this,"Đã thêm thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else //Thêm thất bại.
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Không thêm được!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            RefreshForm(); //Refresh form.
            btnthem.Text = "Thêm";

        }

        //Phương thức sửa nhân viên.
        private void SuaNhanVien()
        {
            NhanVienBusResult rs;
            bool check;

            //Kiểm tra xem có thuộc tính nào bị rỗng ko.
            check = false;
            check = CheckEmpty(nhanvienDTO);

            if (check == false) //Nếu có thuộc tính rỗng.
                return;

            // Kiểm tra tuổi

            check = KiemTraTuoi();
            if (check == false)
                return;

            rs = quantriBUS.SuaMotNhanVien(nhanvienDTO); //Gọi phượng thức sửa dữ liệu.
            if (rs == NhanVienBusResult.OK) //Nếu sửa thành công.
                DevComponents.DotNetBar.MessageBoxEx.Show(this,"Đã cập nhật thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else //Sửa thất bại.
                DevComponents.DotNetBar.MessageBoxEx.Show(this, "Không cập nhật được!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            RefreshForm(); //Refresh form.
            btnsua.Text = "Sửa";
        }

        //Phương thức xóa nhân viên.
        private void XoaNhanVien()
        {
            DialogResult dlg = new DialogResult(); //Hỏi trước khi xóa.
            dlg = DevComponents.DotNetBar.MessageBoxEx.Show(this, "Chắc chắn xóa không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Error);
            if (dlg == DialogResult.Yes) //Nếu chọn xóa.
            {
                NhanVienBusResult rs;

                rs = quantriBUS.XoaMotNhanVien (nhanvienDTO); //Gọi phương thức xóa.
                if (rs == NhanVienBusResult.OK) //Nếu xóa thành công.
                    DevComponents.DotNetBar.MessageBoxEx.Show(this, "Xóa thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                else //Nếu xóa thất bại.
                    DevComponents.DotNetBar.MessageBoxEx.Show("Xóa không thành công!", "Thông Báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                RefreshForm(); //Refresh form.
            }
        }

      
        #endregion

        #region Lấy Hình
        private void btnchonhinh_Click(object sender, EventArgs e)
        {
            DialogResult dlr = new DialogResult();
            openfdl.InitialDirectory = Application.StartupPath;
            dlr = openfdl.ShowDialog();            
            try
            {
                if (dlr != DialogResult.Cancel)
                {
                    String url;
                    url = Application.StartupPath + @"\HinhNhanVien\" + Path.GetFileName(openfdl.FileName);
                    pchinh.ImageLocation = url; //Gán hình vào PictureBox.
                    String filename = openfdl.FileName;

                    int vitri = 0;
                    vitri = filename.LastIndexOf(@"\");
                    filename = filename.Remove(0, vitri + 1);

                    //Nếu hình ko tồn tại trong thư mục hiện hành hình copy hình vào thư mục hiện hành.
                    if (!File.Exists(Application.StartupPath + @"\HinhNhanVien\" + Path.GetFileName(openfdl.FileName)))
                        File.Copy(openfdl.FileName, Application.StartupPath + @"\HinhNhanVien\" + Path.GetFileName(openfdl.FileName), true);
                    duongdanhinh = @"HinhNhanVien\"+filename;
                }
            }
            catch
            {
                DevComponents.DotNetBar.MessageBoxEx.Show("-Hình đang được ứng dụng khác sử dụng!!\n\n-Có thể: \n\n  +Copy hình sang thư mục khác và thử lại\n\n  +Hoặc chọn hình khác",
                                                     "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Các sự kiện trên Form
        private void btnluu_Click(object sender, EventArgs e)
        {
            if (KiemTraNgaySinh() == true)
            {
                if (btnthem.Enabled == true)
                {
                    nhanvienDTO  = new clsNhanVienDTO (); //Khởi tạo đối tượng.
                    //--------------------------------
                    //Lấy dữ liệu.
                    nhanvienDTO.MaNV = txtmanv.Text;
                    nhanvienDTO.HoTen = txthoten.Text;
                    nhanvienDTO.TenDangNhap = txttendangnhap.Text;
                    nhanvienDTO.MatKhau = txtmatkhau.Text;
                    nhanvienDTO.GioiTinh = cbogioitinh.Text;
                    DateTime ngaysinh = Convert.ToDateTime(dtngaysinh.Text.ToString());
                    nhanvienDTO.NgaySinh = ngaysinh;

                    
                    
                    nhanvienDTO.MaBP = cbobophan .SelectedValue .ToString ();
                    nhanvienDTO.MaBC = cbobangcap.SelectedValue .ToString ();
                    nhanvienDTO.MaCV = cbochucvu .SelectedValue .ToString ();
                    nhanvienDTO.HinhAnh = duongdanhinh;

                    //---------------------------------

                    ThemNhanVien(); //Gọi phương thức thêm chức vụ.
                }
                else
                {
                    nhanvienDTO  = new clsNhanVienDTO(); //Khởi tạo đối tượng.
                    //--------------------------------
                    //Lấy dữ liệu.
                    nhanvienDTO.MaNV = txtmanv.Text;
                    nhanvienDTO.HoTen = txthoten.Text;
                    nhanvienDTO.TenDangNhap = txttendangnhap.Text;
                    nhanvienDTO.MatKhau = txtmatkhau.Text;
                    nhanvienDTO.GioiTinh = cbogioitinh.Text;
                    DateTime ngaysinh = Convert.ToDateTime(dtngaysinh.Text.ToString());
                    nhanvienDTO.NgaySinh = ngaysinh;



                    nhanvienDTO.MaBP = cbobophan.SelectedValue.ToString();
                    nhanvienDTO.MaBC = cbobangcap.SelectedValue.ToString();
                    nhanvienDTO.MaCV = cbochucvu.SelectedValue.ToString();
                    nhanvienDTO.HinhAnh = duongdanhinh;

                    //--------------------------------

                    SuaNhanVien(); //Gọi phương thức sửa chức vụ.
                }
            }
        }

        private void btnxoa_Click(object sender, EventArgs e)
        {
            nhanvienDTO  = new clsNhanVienDTO (); //Khởi tạo đối tượng.
            //--------------------------------
            nhanvienDTO.MaNV = txtmanv.Text.Trim();
            //--------------------------------

            XoaNhanVien(); //Gọi phương thức xóa chức vụ.
        }

        #endregion


    }
}